package com.snail.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.snail.mapper.BizOrderDetailMapper;
import com.snail.mapper.BizOrderMapper;
import com.snail.model.dto.cart.OrderProductDTO;
import com.snail.model.dto.cart.OrderSubmitDTO;
import com.snail.model.pojo.cart.BizOrder;
import com.snail.model.pojo.cart.BizOrderDetail;
import com.snail.result.PageResult;
import com.snail.service.BizOrderService;
import com.snail.utils.DynamicDateOrderRefundIdGenerator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
@Transactional  // 确保事务一致性
public class BizOrderServiceImpl implements BizOrderService {
    @Autowired
    private BizOrderMapper bizOrderMapper;
    @Autowired
    private BizOrderDetailMapper bizOrderDetailMapper;
    @Override
    public void createOrder(OrderSubmitDTO submitDTO) {
        // 生成订单编号
        DynamicDateOrderRefundIdGenerator generator = new DynamicDateOrderRefundIdGenerator(3);
        String orderNo = generator.generateOrderId();
        Date now = new Date();

        // 1. 创建主订单
        BizOrder bizOrder = new BizOrder();
        bizOrder.setOrderNo(orderNo);
        bizOrder.setUserId(submitDTO.getUserId());
        bizOrder.setCreateTime(now);
        bizOrder.setUpdateTime(now);

        // 2. 计算总金额并设置
        BigDecimal totalAmount = BigDecimal.ZERO;
        List<BizOrderDetail> details = new ArrayList<>();

        for (OrderProductDTO product : submitDTO.getProducts()) {
            // 计算总金额
            BigDecimal itemTotal = product.getProductPrice()
                    .multiply(new BigDecimal(product.getQuantity()));
            totalAmount = totalAmount.add(itemTotal);

            // 创建订单详情
            BizOrderDetail detail = new BizOrderDetail();
            detail.setOrderNo(orderNo);
            detail.setProductId(product.getProductId());
            detail.setSellerUserId(product.getSellerUserId());
            detail.setQuantity(product.getQuantity());
            detail.setProductPrice(product.getProductPrice());
            details.add(detail);
        }

        // 设置订单金额（这里简化处理，实际可能需要考虑优惠等）
        bizOrder.setTotalAmount(totalAmount);
        bizOrder.setPayAmount(totalAmount);
        bizOrder.setOrderStatus(0); // 待支付状态

        // 3. 保存订单和详情
        bizOrderMapper.createOrder(bizOrder);
        bizOrderDetailMapper.batchInsert(details); // 需要在mapper中实现批量插入
    }
    //根据用户id多条件分页查询用户订单
//    @Override
//    public PageResult selectByUserId(Long userId) {
//        PageHelper
//
//        return null;
//    }

//根据用户id多条件分页查询用户订单
@Override
public PageResult<BizOrder> selectByUserId(BizOrder bizOrder, Integer pageNum, Integer pageSize) {
    // 1. 校验必传参数（用户ID必须存在）
    if (bizOrder.getUserId() == null) {
        throw new IllegalArgumentException("用户ID不能为空");
    }

    // 2. 处理分页参数默认值（如果前端没传，就用默认值）
    pageNum = (pageNum == null || pageNum < 1) ? 1 : pageNum;
    pageSize = (pageSize == null || pageSize < 1) ? 10 : pageSize;

    // 3. 创建MyBatis-Plus分页对象（传入页码和每页条数）
    IPage<BizOrder> page = new Page<>(pageNum, pageSize);

    // 4. 构建查询条件（多条件动态拼接）
    QueryWrapper<BizOrder> queryWrapper = new QueryWrapper<>();

    // 必传条件：用户ID
    queryWrapper.eq("user_id", bizOrder.getUserId());

    // 以下是可选条件（如果bizOrder中该字段有值，就添加这个查询条件）
    // 订单状态（例如：1-待支付，2-已完成等）
    if (bizOrder.getOrderStatus() != null) {
        queryWrapper.eq("order_status", bizOrder.getOrderStatus());
    }

    // 订单编号（支持模糊查询，比如输入"2023"能查到包含"2023"的订单号）
    if (bizOrder.getOrderNo() != null && !bizOrder.getOrderNo().isEmpty()) {
        queryWrapper.like("order_no", bizOrder.getOrderNo());
    }

    // 订单创建开始时间（查询创建时间晚于这个时间的订单）
    if (bizOrder.getCreateTime() != null) {
        queryWrapper.ge("create_time", bizOrder.getCreateTime());
    }

    // 可以继续添加其他需要的条件，格式和上面一样：if(字段不为空)就添加条件

    // 排序：按创建时间倒序（最新的订单显示在前面）
    queryWrapper.orderByDesc("create_time");

    // 5. 执行分页查询（调用mapper的selectPage方法，传入分页对象和查询条件）
    IPage<BizOrder> resultPage = bizOrderMapper.selectPage(page, queryWrapper);

    // 6. 用自定义的PageResult包装结果并返回（直接调用你已有的success方法）
    return PageResult.success(resultPage);
}


}
